package Leetcode.数组字符串;

/**
 * @Author: kirito
 * @Date: 2024/3/10 15:15
 * @Description:
 * 你在和朋友一起玩 猜数字（Bulls and Cows）游戏，该游戏规则如下：
 *
 * 写出一个秘密数字，并请朋友猜这个数字是多少。朋友每猜测一次，你就会给他一个包含下述信息的提示：
 *
 * 猜测数字中有多少位属于数字和确切位置都猜对了（称为 "Bulls"，公牛），
 * 有多少位属于数字猜对了但是位置不对（称为 "Cows"，奶牛）。也就是说，这次猜测中有多少位非公牛数字可以通过重新排列转换成公牛数字。
 * 给你一个秘密数字 secret 和朋友猜测的数字 guess ，请你返回对朋友这次猜测的提示。
 *
 * 提示的格式为 "xAyB" ，x 是公牛个数， y 是奶牛个数，A 表示公牛，B 表示奶牛。
 *
 * 请注意秘密数字和朋友猜测的数字都可能含有重复数字。
 *
 *
 *
 * 示例 1：
 *
 * 输入：secret = "1807", guess = "7810"
 * 输出："1A3B"
 * 解释：数字和位置都对（公牛）用 '|' 连接，数字猜对位置不对（奶牛）的采用斜体加粗标识。
 * "1807"
 *   |
 * "7810"
 * 示例 2：
 *
 * 输入：secret = "1123", guess = "0111"
 * 输出："1A1B"
 * 解释：数字和位置都对（公牛）用 '|' 连接，数字猜对位置不对（奶牛）的采用斜体加粗标识。
 * "1123"        "1123"
 *   |      or     |
 * "0111"        "0111"
 * 注意，两个不匹配的 1 中，只有一个会算作奶牛（数字猜对位置不对）。通过重新排列非公牛数字，其中仅有一个 1 可以成为公牛数字。
 */

public class getHint {
    /**
     * 题意得，公牛比较简单，一次遍历即可，索引相同且对应的数字相同即公牛加1
     * 奶牛得话可以这样思考：
     *  定义两个长度为10得数组   0-9（只有这十个数字嘛）
     *      1.是公牛不做处理
     *      2.将这个数组对应的值加一，比如1220，1是公牛，不管，那么res[2]就是2,res[0]就是1
     *          另外一个数组中如果也有2的话，那么他的数组索引2得位置也有值
     *          然后遍历两个数组，取最小的值
     *      这就刚好符合，数字对，但是位置不对的情况
     *
     * @param secret
     * @param guess
     * @return
     */
    public String getHint(String secret, String guess) {
        int bulls = 0; // 统计位置和数字都正确的个数（公牛）
        int[] cntS = new int[10]; // secret 数字的出现次数统计数组
        int[] cntG = new int[10]; // guess 数字的出现次数统计数组

        // 遍历字符串，比较位置是否相同
        for (int i = 0; i < secret.length(); ++i) {
            if (secret.charAt(i) == guess.charAt(i)) {
                ++bulls; // 位置和数字都正确，公牛数量加一
            } else {
                ++cntS[secret.charAt(i) - '0']; // 统计 secret 数字的出现次数
                ++cntG[guess.charAt(i) - '0'];  // 统计 guess 数字的出现次数
            }
        }

        int cows = 0; // 统计数字正确但位置不正确的个数（奶牛）
        for (int i = 0; i < 10; ++i) {
            cows += Math.min(cntS[i], cntG[i]); // 统计数字正确但位置不正确的个数
        }

        // 返回结果，格式为 "xAyB"，其中 x 是公牛的数量，y 是奶牛的数量
        return bulls + "A" + cows + "B";
    }
}
